/**
 * 链接处理工具类：统一处理小程序内页面、外部链接、文件、视频链接
 */
const LinkHandler = {
  // 配置Tab页路径（需与app.json的tabBar.list一致）
  tabPages: ['/pages/index/index', '/pages/mine/mine'],

  // 支持的文件后缀
  supportFileExts: [
    'pdf', 'doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx',
    'zip', 'rar', 'jpg', 'png', 'jpeg', 'gif', 'webp'
  ],

  // 支持的视频后缀
  supportVideoExts: ['mp4', 'mov', 'avi', 'flv', 'wmv', 'mkv'],

  /**
   * 统一处理链接跳转
   * @param {string} linkUrl - 目标链接
   * @returns {Promise<void>}
   */
  async handleLink(linkUrl,params) {
    if (!linkUrl) {
      // wx.showToast({ title: '链接为空', icon: 'none' });
      return;
    }

    try {
      if (this.isMiniProgramPath(linkUrl)) {
        await this.navigateToMiniPage(linkUrl);
      } else if (this.isExternalLink(linkUrl)) {
        // 先判断是否为视频链接（外部链接可能是视频）
        if (this.isVideoLink(linkUrl)) {
          await this.playVideo(linkUrl,params);
        } else if (this.isFileLink(linkUrl)) {
          await this.previewFile(linkUrl);
        }
      } else if (this.isFileLink(linkUrl)) {
        await this.previewFile(linkUrl);
      } else if (this.isVideoLink(linkUrl)) {
        // 处理非http开头的本地视频（如小程序本地资源）
        await this.playVideo(linkUrl,params);
      } else {
        wx.showToast({ title: '链接格式不支持', icon: 'none' });
      }
    } catch (err) {
      console.error('链接处理失败:', err);
      wx.showToast({ title: '操作失败，请重试', icon: 'none' });
    }
  },

  /**
   * 判断是否为视频链接
   * @param {string} url - 链接
   * @returns {boolean}
   */
  isVideoLink(url) {
    const ext = url.split('.').pop()?.toLowerCase() || '';
    // 同时支持常见视频后缀和m3u8流媒体格式
    return this.supportVideoExts.includes(ext) || url.includes('.m3u8');
  },

  /**
   * 播放视频（支持网络视频和本地视频）
   * @param {string} videoUrl - 视频链接/本地路径
   * @param {object} params - 参数
   * @returns {Promise<void>}
   */
  playVideo(videoUrl,params) {
    return new Promise((resolve, reject) => {
      // 网络视频需要先下载（小视频直接播放，大视频建议先下载）
      if (videoUrl.startsWith('http')) {
        // 对于m3u8等流媒体，直接播放无需下载
        if (videoUrl.includes('.m3u8')) {
          this.openVideoPlayer(videoUrl, params,resolve, reject);
        } else {
          // 普通视频文件：先下载再播放
          wx.showLoading({ title: '视频加载中...', mask: true });
          wx.downloadFile({
            url: videoUrl,
            filePath: `${wx.env.USER_DATA_PATH}/${Date.now()}-${videoUrl.split('/').pop()}`,
            success: (res) => {
              wx.hideLoading();
              if (res.statusCode === 200) {
                this.openVideoPlayer(videoUrl, params,resolve, reject);
              } else {
                reject(new Error(`视频下载失败，状态码: ${res.statusCode}`));
              }
            },
            fail: (err) => {
              wx.hideLoading();
              reject(err);
            }
          });
        }
      } else {
        // 本地视频直接播放
        this.openVideoPlayer(videoUrl, params,resolve, reject);
      }
    });
  },

  /**
   * 打开视频播放器
   * @param {string} src - 视频地址（本地路径或网络地址）
   * @param {object} params - 参数
   * @param {Function} resolve - 成功回调
   * @param {Function} reject - 失败回调
   */
  openVideoPlayer(src, params, resolve, reject) {
    console.log(params)
    // 1. 将 params 对象转为 URL query 字符串（如 "key1=value1&key2=value2"）
    const paramsStr = Object.entries(params)
      .map(([key, value]) => `${key}=${value}`)
      .join('&');

      console.log(paramsStr)
    
    // 2. 拼接 src 和 params 到 URL（注意用 & 分隔多个参数）
    const url = `/pages/database/videoPlayer/index?src=${encodeURIComponent(src)}${paramsStr ? `&${paramsStr}` : ''}`;
    console.log(url)
    // 3. 导航跳转
    wx.navigateTo({
      url: url,
      success: resolve,
      fail: reject
    });
  },

  // 以下为原有方法（保持不变）
  isMiniProgramPath(url) {
    return url.startsWith('/');
  },

  isExternalLink(url) {
    return url.startsWith('http://') || url.startsWith('https://');
  },

  isFileLink(url) {
    const ext = url.split('.').pop()?.toLowerCase() || '';
    return this.supportFileExts.includes(ext);
  },

  navigateToMiniPage(url) {
    return new Promise((resolve, reject) => {
      if (this.tabPages.includes(url.split('?')[0])) {
        wx.switchTab({ url, success: resolve, fail: reject });
      } else {
        wx.navigateTo({
          url,
          success: resolve,
          fail: (err) => {
            if (err.errMsg.includes('page stack overflow')) {
              wx.redirectTo({ url, success: resolve, fail: reject });
            } else {
              reject(err);
            }
          }
        });
      }
    });
  },

  navigateToExternalLink(url) {
    return new Promise((resolve, reject) => {
      wx.navigateTo({
        url: `/pages/index/webView/index?url=${encodeURIComponent(url)}`,
        success: resolve,
        fail: reject
      });
    });
  },

  previewFile(fileUrl) {
    return new Promise((resolve, reject) => {
      wx.showLoading({ title: '加载中...', mask: true });
      
      // 优化1：删除文件名中多余的 "-"，确保路径合法
      const fileName = fileUrl.split('/').pop();
      const filePath = `${wx.env.USER_DATA_PATH}/${Date.now()}-${fileName}`;
      
      // 优化2：提取文件后缀，指定 fileType（可选但推荐）
      const fileType = fileName.split('.').pop() || '';
  
      wx.downloadFile({
        url: fileUrl,
        filePath: filePath,
        success: (downloadRes) => {
          console.log("downloadRes=========")
          console.log(downloadRes)
          wx.hideLoading();
          if (downloadRes.statusCode === 200) {
            wx.openDocument({
              filePath: downloadRes.filePath,
              fileType: fileType, // 手动指定文件类型，提升识别成功率
              showMenu: true,
              success: resolve,
              fail: reject
            });
          } else {
            reject(new Error(`下载失败，状态码: ${downloadRes.statusCode}`));
            wx.showToast({ title: '文件下载失败', icon: 'none' });
          }
        },
        fail: (err) => {
          wx.hideLoading();
          reject(err);
          wx.showToast({ title: '下载失败，请检查网络', icon: 'none' });
        }
      });
    });
  }
};

module.exports = LinkHandler;